package com.utils.page;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

/**
 * 分页/查询工具类
 * @author lyinlong
 *
 */
public class PageBean<T> {

	//参数vo
	private T obj;
	/**
	 * 地址URL
	 */
	private String url;
	/**
	 * 参数
	 * &keyword=""&....
	 */
	private String params;
	/**
	 * 页码
	 */
	private Integer pageNo;
	/**
	 * 每页显示数量
	 */
	private Integer pageSize;
	/**
	 * 查询的结果
	 */
	private List<T> results;
	/**
	 * 不分页的总数
	 */
	private Integer totalCount;
	/**
	 * 总页数(最后一页的页面)
	 */
	private Integer totalPageNo;
	/**
	 * 在页面显示的5个页码
	 */
	private List<Integer> showNums;
	/**
	 * 实际的pageNO
	 */
	private Integer actulPageNo;
	/**
	 * 查询条件List
	 */
	private List<Object> conList;
	/**
	 * 查询条件 Map
	 */
	private Map<String, Object> conMap;


	public T getObj() {
		return obj;
	}

	public void setObj(T obj) {
		this.obj = obj;
	}

	public PageBean() {}

	public PageBean(Integer pageNo, Integer pageSize) {
		setPageSize(pageSize);
		setPageNo(pageNo);
		setActulPageNo(pageNo == null ? 1 : pageNo );
	}

	public PageBean(Integer pageNo, Integer pageSize, List<Object> conList,
			Map<String, Object> conMap) {
		this.conList = conList;
		this.conMap = conMap;

		setPageSize(pageSize);
		setPageNo(pageNo);
		setActulPageNo(pageNo == null ? 1 : pageNo );
	}
	public PageBean(Map<String,Object> params,T vo,Integer pageNo, Integer pageSize) {
		setPageSize(pageSize);
		setPageNo(pageNo);
		setActulPageNo(pageNo == null ? 1 : pageNo );
		this.obj = vo;
		this.conMap = params;
	}
	public PageBean(Map<String,Object> params,Integer pageNo, Integer pageSize) {
		setPageSize(pageSize);
		setPageNo(pageNo);
		setActulPageNo(pageNo == null ? 1 : pageNo );
		this.conMap = params;
	}
	public PageBean(Integer pageNo, Integer pageSize, List<T> results,
			Integer totalCount, Integer totalPageNo, List<Object> conList,
			Map<String, Object> conMap) {
		super();
		this.pageNo = pageNo;
		this.pageSize = pageSize;
		this.results = results;
		this.totalCount = totalCount;
		this.totalPageNo = totalPageNo;
		this.conList = conList;
		this.conMap = conMap;
		setActulPageNo(pageNo == null ? 1 : pageNo );
	}
	public Integer getPageNo() {
		return pageNo;
	}
	public void setPageNo(Integer pageNo) {
		pageNo = pageNo == null ? 0 : (pageNo - 1) * (pageSize == null ? 15 : pageSize) ;
		this.pageNo = pageNo;
	}
	public Integer getPageSize() {
		return pageSize;
	}
	public void setPageSize(Integer pageSize) {
		pageSize = pageSize == null || pageSize < 0 ? 15 : pageSize;
		this.pageSize = pageSize;
	}
	public List<T> getResults() {
		return results;
	}
	public void setResults(List<T> results) {
		this.results = results;
	}
	public Integer getTotalCount() {
		return totalCount;
	}
	public void setTotalCount(Integer totalCount) {
		this.totalCount = totalCount;
	}
	// 获取总页数
	public Integer getTotalPageNo() {
		totalPageNo = totalPageNo != null ? totalPageNo : ((totalCount == null ? 0 : totalCount ) / pageSize) + (((totalCount == null ? 0 : totalCount ) % pageSize) > 0 ? 1 : 0);
		return totalPageNo;
	}
	public void setTotalPageNo(Integer totalPageNo) {
		this.totalPageNo = totalPageNo;
	}
	public List<Object> getConList() {
		return conList;
	}
	public void setConList(List<Object> conList) {
		this.conList = conList;
	}
	public Map<String, Object> getConMap() {
		return conMap;
	}
	public void setConMap(Map<String, Object> conMap) {
		this.conMap = conMap;
	}
	public Integer getActulPageNo() {
		return actulPageNo == null ? pageNo : actulPageNo;
	}

	public void setActulPageNo(Integer actulPageNo) {
		this.actulPageNo = actulPageNo ;
	}

 	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}

	public String getParams() {
		if(conMap != null){
			StringBuffer buffer = new StringBuffer();
			for (String key : conMap.keySet()) {
				buffer.append("&");
				buffer.append(key);
				buffer.append("=");
				buffer.append(conMap.get(key) == null ? "" : conMap.get(key));
			}
			this.params = buffer.toString();
		}
		return params;
	}

	/**
	 * 生成分页需要的参数
	 */
	public void setParams() {
		if(conMap != null){
			StringBuffer buffer = new StringBuffer();
			for (String key : conMap.keySet()) {
				buffer.append("&");
				buffer.append(key);
				buffer.append("=");
				buffer.append(conMap.get(key) == null ? "" : conMap.get(key));
			}
			this.params = buffer.toString();
		}
		
	}
	public void setParams(String params) {
		this.params = params;
	}
	/**
	 * 生成页面(当前页在最中间)
	 * @return
	 */
	public List<Integer> getShowNums() {
		actulPageNo = actulPageNo == null ? 1 : actulPageNo;

		//当前页码在所有页面中的下标
		int index = 1;
		//所有页码
		List<Integer> allNos = new ArrayList<Integer>();
		for (int i = 0 ; i <= getTotalPageNo(); i++) {
			if(i == actulPageNo)
				index = i;
			allNos.add(i);

		}
		// 默认页码
		Integer[] pageNos = new Integer[]{1,2,3,4,5};

		try {
			pageNos = new Integer[]{
					index - 2 < 0 ? null : index == totalPageNo ? allNos.get(index - 4) : allNos.get(index - 2)  ,

					index - 1 < 0 ? null : index == totalPageNo ? allNos.get(index - 3) : allNos.get(index - 1) ,

					index < 0 ? null : index == totalPageNo ? allNos.get(index - 2) : allNos.get(index ) ,

					index + 1 < 0 ? null : index == totalPageNo ? allNos.get(index - 1) : allNos.get(index + 1) ,

					index + 2 < 0 ? null : index == totalPageNo ? allNos.get(index) : allNos.get(index + 2)
							};

		} catch (Exception e) {
			// TODO: handle exception
		}

		if(allNos.size() < 6){
			pageNos = new Integer[allNos.size()];
			for (int i = 0; i < allNos.size(); i++) {
				pageNos[i] = i + 1;
			}
		}
		else if(getTotalPageNo() >=5  ){
			if(pageNos[0] == null || pageNos[0] == 0 || allNos.size() == 6)
				pageNos = new Integer[]{1,2,3,4,5};
		}

		if(allNos.get(allNos.size() - 1) < pageNos[pageNos.length - 1])
			pageNos[pageNos.length - 1] = null;

		showNums = Arrays.asList(pageNos);

		return showNums;
	}

	/**
	 * 获取首页页码
	 * @return
	 */
	public Integer getFirstPageNo() {
		return 1;
	}
	
	/**
	 * 检测参数是否有空字符串
	 */
	public void check(){
		if(conMap != null){
			for (String key : conMap.keySet()) {
				if (conMap.get(key) != null && (conMap.get(key).equals("") || conMap.get(key).equals("-1"))) {
					conMap.put(key, null);
				}
			}
		}
	}
}
